package HashTable;

import java.util.HashMap;

/**
 * Lettcode 594. 最长和谐子序列
 * 和谐数组是指一个数组里元素的最大值和最小值之间的差别正好是1。
 *
 * 现在，给定一个整数数组，你需要在所有可能的子序列中找到最长的和谐子序列的长度。
 *
 * 示例 1:
 *
 * 输入: [1,3,2,2,5,2,3,7]
 * 输出: 5
 * 原因: 最长的和谐数组是：[3,2,2,2,3].
 * 说明: 输入的数组长度最大不超过20,000.
 *
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/longest-harmonious-subsequence
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 */
public class findLHS {
    /**
     * 方法一：偏暴力法
     * @param nums
     * @return
     */
    public int findLHS(int[] nums) {
        if (nums == null || nums.length == 0) {
            return 0;
        }
        HashMap<Integer, Integer> numToCount = new HashMap<>();
        for (int i: nums) {
            numToCount.put(i, numToCount.getOrDefault(i, 0) + 1);
        }
        int maxRes = Integer.MIN_VALUE;
        for (int i: numToCount.keySet()) {
            for (int j : numToCount.keySet()) {
                if (i - j == 1) {
                    if (numToCount.get(i) + numToCount.get(j) > maxRes) {
                        maxRes = numToCount.get(i) + numToCount.get(j);
                    }
                }
            }
        }
        return Math.max(maxRes, 0);
    }

    public int findLHSI(int[] nums) {
        if (nums == null || nums.length == 0) {
            return 0;
        }
        HashMap<Integer, Integer> numToCount = new HashMap<>();
        for (int i: nums) {
            numToCount.put(i, numToCount.getOrDefault(i, 0) + 1);
        }
        int maxRes = Integer.MIN_VALUE;
        for (int i: numToCount.keySet()) {
            if (numToCount.containsKey(i + 1)) {
                int tempRes = numToCount.get(i) + numToCount.get(i + 1);
                maxRes = Math.max(tempRes, maxRes);
            }
        }
        return Math.max(maxRes, 0);
    }
}
